package method;

/**
 * @Author quan
 * @Description 汉诺塔问题
 * @Date 2023/3/8 22:19
 */
public class HanoiTower {
    public static void main(String[] args) {
        int n = 3;
        hanoiTower(n,'A','B','C');
    }
    // 此时需要将A上的n个盘子移动到C上，B作为辅助
    public static void hanoiTower(int n,char A,char B,char C) {
        // 1.base case。不借助任何其他的移动，一步就可到位的条件是啥？n取什么值时？
        // 当n == 1时，说明此时A上就一个盘子，一步到位，直接将A上的这一个盘子移动到C上即可
        if (n == 1) {
            move(1,A,C);
            return;
        }
        // 此时n >= 2
        // 先将A上的这n - 1个盘子移动到B上，C作为辅助
        hanoiTower(n - 1,A,C,B);
        // 此时A上就只剩下最大的那个n盘子,一步到位，将最大的盘子移动到C上即可
        move(n,A,C);
        // 将B上的这n - 1个盘子从B移动到C，A作为辅助
        hanoiTower(n - 1,B,A,C);
    }
    // 将编号为n的盘子从source-> dist塔上
    private static void move(int nDisks, char sourceTower, char distTower) {
        System.out.println("编号为" + nDisks + "的盘子从" + sourceTower + "->" + distTower);
    }
}